<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="Jwt7z" id="Jwt7z"><span data-lake-id="uf9e7d81c" id="uf9e7d81c">典型回答</span></h1>
  <p data-lake-id="u98f8a4d1" id="u98f8a4d1"><br></p>
  <p data-lake-id="u64d81baa" id="u64d81baa"><span data-lake-id="u9aec6bc1" id="u9aec6bc1">我们都知道，Redis是不支持回滚的，即使是Redis的事务和Lua脚本，在执行的过程中，如果出现了错误，也是无法回滚的，可是，为什么呢？</span></p>
  <p data-lake-id="u5aa4dc4d" id="u5aa4dc4d"><span data-lake-id="u8cecce77" id="u8cecce77">​</span><br></p>
  <p data-lake-id="u6f8e99e4" id="u6f8e99e4"><span data-lake-id="ueb72ed94" id="ueb72ed94">在Redis的官网文档中明确的提到过，不支持回滚：</span><a href="https://redis.io/docs/interact/transactions/" target="_blank" data-lake-id="ua39ef38d" id="ua39ef38d"><span data-lake-id="ud8371f81" id="ud8371f81">https://redis.io/docs/interact/transactions/</span></a></p>
  <p data-lake-id="u4907aeaa" id="u4907aeaa"><img src="https://cdn.nlark.com/yuque/0/2023/png/5378072/1703999289243-9f43239e-2bd3-44c6-a5a2-590209d64ef8.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_30%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="u23afc87f" id="u23afc87f"><span data-lake-id="uac0e342b" id="uac0e342b">不支持回滚主要的原因是</span><strong><span data-lake-id="ud8690ce6" id="ud8690ce6">支持回滚将对 Redis 的简洁性和性能产生重大影响。</span></strong></p>
  <p data-lake-id="u3df80db9" id="u3df80db9"><strong><span data-lake-id="u4c350918" id="u4c350918">​</span></strong><br></p>
  <p data-lake-id="u9a5f64c4" id="u9a5f64c4"><span data-lake-id="u7653c329" id="u7653c329">然后，Redis官方博客中还有一篇文章，</span><a href="https://redis.com/blog/you-dont-need-transaction-rollbacks-in-redis/" target="_blank" data-lake-id="ue33f0058" id="ue33f0058"><span data-lake-id="u53b3aa82" id="u53b3aa82">You Don’t Need Transaction Rollbacks in Redis</span></a><span data-lake-id="u2f77dc07" id="u2f77dc07"> 这里介绍了更多的内容。</span></p>
  <p data-lake-id="u66456188" id="u66456188"><span data-lake-id="ua1de66e9" id="ua1de66e9">​</span><br></p>
  <p data-lake-id="ucf11fceb" id="ucf11fceb"><span data-lake-id="ue0c3ec4b" id="ue0c3ec4b">我这里试着帮大家总结一下，主要有以下几个原因：</span></p>
  <p data-lake-id="u5c94fd54" id="u5c94fd54"><span data-lake-id="u74199ebe" id="u74199ebe">​</span><br></p>
  <p data-lake-id="u373ac1d7" id="u373ac1d7"><span data-lake-id="u7eb3bea2" id="u7eb3bea2">1、</span><strong><span data-lake-id="u958c1e5f" id="u958c1e5f">使用场景</span></strong><span data-lake-id="ue4c180e8" id="ue4c180e8">：Redis 通常用作缓存和，而不是作为需要复杂事务处理的关系型数据库。因此，它的目标用户通常不需要复杂的事务支持。如果需要的话，直接用数据库就行了。</span></p>
  <p data-lake-id="u52569be4" id="u52569be4"><strong><span data-lake-id="ufb2e441a" id="ufb2e441a">2、性能优先</span></strong><span data-lake-id="uc57ae3f9" id="uc57ae3f9">：Redis 是一个高性能的K-V存储系统，它优化了速度和效率。引入回滚机制会增加复杂性和开销，从而影响其性能。</span></p>
  <p data-lake-id="ufc0a09e8" id="ufc0a09e8"><span data-lake-id="u7c25756f" id="u7c25756f">3、</span><strong><span data-lake-id="u457e2497" id="u457e2497">简化设计</span></strong><span data-lake-id="u9d8c1580" id="u9d8c1580">：Redis 的设计哲学倾向于简单和高效。回滚机制会使系统变得复杂，增加了错误处理和状态管理的难度。</span></p>
  <p data-lake-id="u1a3976ef" id="u1a3976ef"><span data-lake-id="uf73730f3" id="uf73730f3">4、</span><strong><span data-lake-id="ua583ee51" id="ua583ee51">数据类型和操作</span></strong><span data-lake-id="u996d3ea7" id="u996d3ea7">：Redis 支持的数据类型和操作通常不需要复杂的事务支持。大多数命令都是原子性的。</span></p>
  <p data-lake-id="u11d2f6f3" id="u11d2f6f3"><span data-lake-id="u525221ea" id="u525221ea">5、</span><strong><span data-lake-id="ufedd31ee" id="ufedd31ee">单线程模型</span></strong><span data-lake-id="udfd03702" id="udfd03702">：Redis事务是提交后一次性在单线程中执行的，而关系型数据库如MySQL是交互式的多线程模型执行的，所以MySQL需要事务的回滚来确保并发更新结果不出现异常。而Redis不太需要。</span></p>
  <p data-lake-id="u45ffbd28" id="u45ffbd28"><span data-lake-id="u3cb64609" id="u3cb64609">6、</span><strong><span data-lake-id="u61db71eb" id="u61db71eb">出错情况</span></strong><span data-lake-id="u616fdab9" id="u616fdab9">：在Redis中，命令失败的原因比较有限：语法错误、操作的数据的类型不一致、Redis资源不足等。而这几种问题，是应该在编码阶段就发现的，而不应该在Redis执行过程中出现。</span></p>
  <p data-lake-id="u1c671be4" id="u1c671be4"><span data-lake-id="u71ada0e4" id="u71ada0e4">​</span><br></p>
  <p data-lake-id="ud88cedea" id="ud88cedea"><span data-lake-id="u11ddda93" id="u11ddda93">​</span><br></p>
  <p data-lake-id="u582bc53b" id="u582bc53b"><strong><u><span data-lake-id="u24421aa5" id="u24421aa5">总结一下，以为Redis的设计就是简单、高效等，所以引入事务的回滚机制会让系统更加的复杂，并且影响性能。从使用场景上来说，Redis一般都是被用作缓存的，不太需要很复杂的事务支持，当人们需要复杂的事务时会考虑持久化的关系型数据库。相比于关系型数据库，Redis是通过单线程执行的，在执行过程中，出现错误的概率比较低，并且这些问题一般来编译阶段都应该被发现，所以就不太需要引入回滚机制。</span></u></strong></p>
  <p data-lake-id="u489b4569" id="u489b4569"><strong><u><span data-lake-id="u6889945d" id="u6889945d">​</span></u></strong><br></p>
  <p data-lake-id="uc1a7be53" id="uc1a7be53"><strong><u><span data-lake-id="uf624a89e" id="uf624a89e">​</span></u></strong><br></p>
  <h1 data-lake-id="QsFZz" id="QsFZz"><span data-lake-id="u08ac6c57" id="u08ac6c57">扩展知识</span></h1>
  <p data-lake-id="ub967d2b5" id="ub967d2b5"><br></p>
  <h2 data-lake-id="HGCvU" id="HGCvU"><span data-lake-id="ud5b81e2b" id="ud5b81e2b">不支持回滚如何保证原子性？</span></h2>
  <p data-lake-id="u219da3ef" id="u219da3ef"><br></p>
  <p data-lake-id="ub09ed148" id="ub09ed148"><br></p>
 </body>
</html>